TODO :
- Vérifier qu’il n’y a plus de TODO dans le fichier.
- Ajouter des images, diagrammes et extraits de code.
- Ajouter des échantillons de données pour expliciter chaque étape.
Prédire les résultats d’éléctions présidentielles française d’un bureau de vote, dans l’idéal. Mais en réalité le but était surtout de trouver des correlations et dépendances entre les résultats d’éléctions présidentielles française d’un bureau de vote, et des données démographiques.
Les préférences politiques des individus peuvent être façonnées par des variables socio-démographiques telles que l’âge, le niveau d’éducation, la situation économique ou encore le lieu de résidence. Nous voulions essayer d’observer des tendances que créent ces cadres théoriques. Plusieurs cadres théoriques permettent de formuler des hypothèses sur ces influences potentielles.
La théorie de la socialisation politique suppose que des facteurs comme l’âge, le genre et la composition familiale jouent un rôle dans la formation des opinions politiques. Par exemple, on pourrait s’attendre à ce que les jeunes adultes soient plus attirés par des idées progressistes, tandis que les générations plus âgées privilégient des positions conservatrices, influencées par leurs expériences passées.
Les théories liées au clivage de classe sociale, inspirées par les travaux de Karl Marx et Pierre Bourdieu, postulent que la position des individus dans la hiérarchie socio-professionnelle peut orienter leurs préférences politiques. Les individus occupant des emplois manuels ou précaires pourraient être davantage sensibles aux discours en faveur de la justice sociale, tandis que les catégories socio-professionnelles supérieures seraient plus réceptives aux politiques favorisant l’investissement et la stabilité économique.
Le capital culturel, tel que défini par Pierre Bourdieu, pourrait également jouer un rôle dans le comportement électoral. Les niveaux de qualification peuvent influencer la perception des enjeux politiques : les personnes disposant d’un diplôme supérieur pourraient privilégier des valeurs universalistes et libérales, alors que les moins diplômés pourraient être plus sensibles aux discours protectionnistes ou nationalistes.
La théorie du contexte géographique met en avant l’importance du lieu de vie et des interactions sociales locales sur les comportements politiques. Les caractéristiques urbaines et rurales, la proportion de logements sociaux ou encore l’ancienneté des constructions peuvent être des indicateurs pertinents pour comprendre les dynamiques électorales locales.
La théorie de la privation relative suggère que les inégalités perçues entre les attentes des individus et leur situation réelle peuvent les amener à soutenir des mouvements politiques contestataires. Des indicateurs comme le taux de pauvreté, le niveau de vie ou la précarité de l’emploi pourraient refléter ce sentiment de frustration.
Enfin, la théorie du choix rationnel propose que les électeurs adoptent des comportements stratégiques, en cherchant à maximiser leurs bénéfices individuels à travers leurs choix politiques. Par exemple, les propriétaires immobiliers ou les ménages vivant seuls pourraient orienter leurs votes en fonction des politiques perçues comme avantageuses ou défavorables à leurs intérêts.
Quel lien existe entre les différents facteurs socio-démographiques et influencent-ils les choix politiques des citoyens ?
L’objectif est d’explorer ces hypothèses théoriques en s’appuyant sur des données socio-démographiques et électorales de plusieurs années. Cette étape théorique permet de poser les bases d’une analyse empirique qui pourra confirmer ou infirmer ces hypothèses en fonction des observations. Nous étudierons les liens au travers de différentes techniques d’analyse statistiques.
D’après le cadre théorique, la première étape consiste à collecter les résultats des élections présidentielles. Pour enrichir notre jeu de données, nous avons choisi de les détailler au niveau des bureaux de vote. La plateforme data.gouv.fr nous donne accès à ce type de données. Lors de chaque élection, environ 70 000 bureaux de vote partagent leurs résultats. Nous limiterons toutefois notre étude aux trois dernières élections présidentielles (2012, 2017 et 2022), ce qui sera largement suffisant pour répondre à notre problématique.
De plus, nous nous concentrerons uniquement sur les bureaux de vote situés en France métropolitaine afin de simplifier la visualisation des données sur une carte. Cette restriction n’a qu’un faible impact sur la représentativité globale du jeu de données.
À partir du cadre théorique, nous avons identifié plusieurs groupes de facteurs socio-démographiques susceptibles d’influencer les orientations politiques des individus :
Facteurs démographique : ce groupe comprend des variables telles que l’âge, le genre et la composition familiale. Ces éléments permettent d’évaluer l’impact de la socialisation politique, notamment l’influence des générations et des expériences de vie sur le comportement électoral.
Facteurs travail et revenus : ces variables incluent la catégorie socio-professionnelle, le type d’emploi (salarié ou indépendant), le taux d’activité et le niveau de vie. Elles permettent d’explorer le rôle des disparités économiques et de la hiérarchie sociale sur les préférences politiques, en lien avec la théorie du clivage de classe.
Facteurs éducation : le niveau de diplôme et les qualifications constituent des indicateurs clés du capital culturel. Ces données sont utiles pour comprendre la manière dont l’accès au savoir et la formation influencent la perception des enjeux politiques.
Facteurs lieu de vie : ce groupe comprend des variables liées au lieu de résidence, telles que la répartition urbaine ou rurale, la proportion de logements sociaux, et l’ancienneté des constructions. Ces éléments permettent d’examiner l’impact du contexte spatial et des interactions sociales locales sur le vote.
Facteurs conditions de vie : le taux de pauvreté, la précarité de l’emploi et la composition des ménages permettent de mesurer le sentiment de privation relative et son effet potentiel sur l’adhésion à des mouvements politiques contestataires.
Facteurs mode de vie : certaines variables, comme la propriété immobilière ou la structure des ménages (par exemple, vivre seul ou en famille), peuvent refléter des comportements électoraux stratégiques, en lien avec des choix rationnels visant à préserver ou à optimiser une situation personnelle.
Certaines de ces données ont été directement récupérées sur le site de l’INSEE, via des études ou des cartes interactives avec export de données (par exemple, statistiques-locales.insee.fr). Nous avons rencontré des difficultés pour obtenir des données complètes et précises, par exemple pour l’âge moyen des habitants. En effet, la donnée était séparée en tranches d’âge, ce qui ne correspondait pas exactement à notre besoin. De plus, ces tranches d’age étaient réduites à moins de 25 ans, 25-64 ans et plus de 65 ans. Nous avons donc dû nous contenter de ces données, en espérant qu’elles soient suffisantes pour notre étude.
Nous avons aussi rencontré des problèmes pour obtenir des données sur le niveau d’études, qui n’étaient pas disponibles pour toutes les années. Pour ces paramètres, nous avons choisi des laisser ces valeurs manquantes plutôt que de les calculer avec des valeurs approximatives. Cela nous permet de conserver une certaine rigueur dans notre analyse, nous laissant toujours la possibilité de revenir sur ce choix et d’imputer les données si besoin.
Les données socio-démographiques concernant les communes d’outre-mer n’ont pas été incluses dans notre étude, car il manquait trop de données pour être comparables avec celles de la France métropolitaine. Cela aurait introduit un biais dans notre analyse, en mélangeant des données provenant de contextes socio-économiques différents.
La grande majorité de ces données étant regroupées par commune, nous avons décidé de les répartir proportionnellement entre les bureaux de vote en fonction du nombre de votants.
Nous aurions aussi aimmé utiliser d’autres données, ou des jeux plus précis pour notre analyse, mais ces données étaient rapportés aux départements ou région et non par commune. Cela aurait nécessité un travail de fusion et de répartition des données plus complexe, que nous n’avons pas jugé utile pour notre étude.
En revanche, la collecte des données concernant les revenus, le lieu de vie et les conditions de vie a été plus complexe. Ces données sont fournies sous forme de « carreaux » géographiques de 200 mètres de côté. Il a donc été nécessaire de récupérer les contours géographiques des bureaux de vote, de convertir et harmoniser les formats de coordonnées (CRS), puis de fusionner ces ensembles de données. La librairie R sf a été utilisée pour effectuer ces opérations, notamment en croisant les carreaux de 200 mètres avec les contours des bureaux de vote. Cette tâche s’est avérée chronophage en raison du coût computationnel élevé des calculs nécessaires pour chaque opération. Certaines données ont dû être additionnées, d’autres moyennées. Une vérification finale a montré une perte de seulement 0,01 % des données, ce qui constitue un excellent résultat pour ce type de fusion géographique.
Concernant le nettoyage des données, plusieurs étapes ont été nécessaires pour garantir la qualité et la cohérence des informations. Les données électorales et socio-démographiques ont été collectées auprès de différentes sources, nécessitant une harmonisation des formats et des variables. Nous avons d’abord sélectionné les colonnes pertinentes pour notre étude, en éliminant les doublons et les variables inutiles. Un travail de normalisation a été effectué pour uniformiser les noms des colonnes et faciliter les opérations de fusion et de jointure. Les données ont été vérifiées afin d’éviter les valeurs aberrantes et garantir leur cohérence. Certaines transformations ont également été effectuées pour faciliter la visualisation et les rendre compatibles avec notre modèle d’analyse.
Le point de centralisation des données finales est le code bureau de vote, un identifiant unique attribué à chaque bureau de vote.
Pour les résultats des élections, il a d’abord été nécessaire de transformer la liste des votes par candidat dans chaque bureau de vote en catégories agrégées correspondant aux principaux courants politiques : Extrême Gauche, Gauche, Centre, Droite et Extrême Droite. Cette étape permet de simplifier l’analyse des tendances politiques tout en conservant une granularité suffisante.
Une colonne “Code” a été ajoutée en combinant les codes du département, de la commune et du bureau de vote, ce qui facilite la fusion avec d’autres jeux de données. Certaines colonnes, telles que les noms des départements ou les pourcentages inutiles (ex. : % Abstentions/Inscrits), ont été supprimées pour alléger le jeu de données. Une colonne “nonExp” a été créée pour regrouper les bulletins blancs et nuls. Cette information nous aide à mieux comprendre les niveaux de participation et de contestation.
Les données finales ont été organisées de manière à regrouper les colonnes liées à chaque courant politique, en mettant en avant les variables principales (comme les pourcentages par votant, inscrits et suffrages exprimés).
Un extrait des données nettoyées et organisées est présenté ci-dessous :
<<<<<<< HEAD| Annee | Code | Libellé de la commune | Votants | nonExp | VoixEG | % Voix/VotantEG | VoixG | % Voix/VotantG | VoixC | % Voix/VotantC | VoixD | % Voix/VotantD | VoixED | % Voix/VotantED |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2022 | 010010001 | L'Abergement-Clémenciat | 537 | 17 | 6 | 1.117318 | 107 | 19.92551 | 168 | 31.28492 | 47 | 8.752328 | 192 | 35.75419 |
| 2022 | 010020001 | L'Abergement-de-Varey | 175 | 4 | 5 | 2.857143 | 61 | 34.85714 | 60 | 34.28571 | 8 | 4.571429 | 37 | 21.14286 |
| 2022 | 010040001 | Ambérieu-en-Bugey | 863 | 23 | 12 | 1.390498 | 286 | 33.14021 | 183 | 21.20510 | 53 | 6.141367 | 306 | 35.45771 |
Concernant les facteurs socio-démographiques, certaines données étaient déjà disponibles au niveau des bureaux de vote, tandis que d’autres étaient regroupées au niveau communal. Ces dernières ont été réparties entre les bureaux de vote en suivant une répartition proportionnelle basée sur le nombre de votants, comme décrit précédemment. Les données ont ensuite été allégé et les colonnes renommés pour améliorer la lisibilité globale des données. Les colonnes inutiles ont été supprimé, pour éviter de garder des informations superflues.
Afin de préparer la visualisation de nos données sur des cartes, nous avons conservé un fichier spatial au format GeoJSON contenant les contours des bureaux de vote, identifiés par l’ID code_bureau_vote. Ce fichier, d’une taille de 600 Mo, a été isolé pour éviter de ralentir le traitement des données lors des analyses statistiques. En cas de besoin, il peut être facilement fusionné avec notre jeu de données pour générer des visualisations cartographiques.
Ces étapes ont permis de disposer d’un jeu de données homogène et prêt pour l’analyse statistique des corrélations entre les variables socio-démographiques et les résultats électoraux. Voici un échantillon des 72 colonnes finales :
<<<<<<< HEAD| code_bureau_vote | votants | non_exp | voix_eg | pourcentage_voix_votant_eg | voix_g | pourcentage_voix_votant_g | voix_c | pourcentage_voix_votant_c | voix_d | pourcentage_voix_votant_d | voix_ed | pourcentage_voix_votant_ed | code_insee | population_ratio | libelle | nb_25 | nb_25_64 | nb_65 | prop_25 | prop_25_64 | prop_65 | taux_nat | taux_mort | nb_non_scolarises | part_non_peu_diplomes | part_bepc_brevet | part_cap_bep | part_bac | nb_h_total | nb_f_total | nb_h_15_24 | nb_h_25_64 | nb_h_65 | nb_f_15_24 | nb_f_25_64 | nb_f_65 | population_totale | proportion_h | proportion_f | nb_emplois_lt | taux_activite | part_emplois_salaries | part_agriculteurs | part_emplois_non_salaries | part_artisans | part_commercants | part_chefs_entreprise | part_cadres | part_prof_intermediaires | part_employes | part_ouvriers | annees | nb_menages | nb_menages_pauvres | nb_menages_seul | nb_menages_5plus | nb_menages_proprietaires | nb_menages_monoparentaux | niveau_vie_total | surface_totale_logements | nb_logements_collectifs | nb_logements_maisons | nb_log_avant_1945 | nb_log_1945_1969 | nb_log_1970_1989 | nb_log_apres_1990 | nb_log_date_inconnue | nb_logements_sociaux | part_bac2 | part_bac3_4 | part_bac5_plus |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 010010001 | 508 | 9 | 29 | 5.708661 | 125 | 24.6063 | 54 | 10.62992 | 165 | 32.48031 | 126 | 24.80315 | 01001 | 1.0000000 | L'Abergement-Clémenciat | 247.0000 | 409.000 | 128.0000 | 31.5 | 52.2 | 16.3 | 13.0 | 7.1 | 555.000 | 27.4 | 5.8 | 25.4 | 16.8 | 245.0000 | 231.0000 | 35.0000 | 163.0000 | 47.00000 | 32.000 | 148.0000 | 51.00000 | 476.000 | 0.515 | 0.485 | 73.0000 | 74.9 | 64.4 | 18.8 | 35.6 | 0.0 | 9.4 | 15.4 | 37.7 | 18.7 | 37.3 | 95.1 | 2008-2012 | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA |
| 010020001 | 179 | 5 | 17 | 9.497207 | 49 | 27.3743 | 22 | 12.29050 | 48 | 26.81564 | 38 | 21.22905 | 01002 | 1.0000000 | L'Abergement-de-Varey | 59.0000 | 124.000 | 39.0000 | 26.5 | 56.0 | 17.5 | 18.6 | 11.4 | 169.000 | 15.6 | 3.4 | 22.3 | 18.4 | 72.0000 | 69.0000 | 7.0000 | 51.0000 | 14.00000 | 10.000 | 45.0000 | 13.00000 | 141.000 | 0.511 | 0.489 | 17.0000 | 78.5 | 44.4 | 51.5 | 55.6 | 0.0 | 0.0 | 48.5 | 0.0 | 0.0 | 61.1 | 92.2 | 2008-2012 | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA |
| 010040001 | 800 | 19 | 118 | 14.750000 | 227 | 28.3750 | 74 | 9.25000 | 173 | 21.62500 | 189 | 23.62500 | 01004 | 0.1229445 | Ambérieu-en-Bugey | 589.2731 | 855.325 | 256.3393 | 34.6 | 50.3 | 15.1 | 14.2 | 7.6 | 1205.963 | 28.1 | 6.7 | 24.5 | 18.6 | 556.0781 | 532.1039 | 122.0839 | 350.6378 | 83.47933 | 110.773 | 333.9173 | 87.29061 | 1088.182 | 0.511 | 0.489 | 949.0088 | 74.4 | 90.6 | 0.1 | 9.4 | 5.5 | 11.2 | 26.9 | 33.0 | 23.4 | 55.2 | 90.3 | 2008-2012 | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA |
L’analyse des données doit être la plus précise possible. Pour cela, nous avons choisi de créer un jeu de données intermédiaire qui élimine la duplication des bureaux de vote sur plusieurs années. Nous sélectionnerons aléatoirement une seule observation par bureau de vote parmi différentes années afin d’éviter un biais de similitude. En effet, un bureau ayant historiquement voté à droite a de fortes chances de continuer à voter de la même manière, ce qui pourrait fausser l’analyse si nous incluons plusieurs observations temporelles sans ajustement.
Nous ajoutons également une variable score comprise entre 0 et 1, qui
indique l’orientation politique moyenne :
- 0 correspond à l’extrême gauche,
- 0.5 représente le centre,
- 1 correspond à l’extrême droite.
data <- data %>%
mutate(
score_orientation = round(
(voix_ed * 1 + voix_d * 0.75 + voix_c * 0.5 + voix_g * 0.25 + voix_eg * 0) /
(voix_eg + voix_g + voix_c + voix_d + voix_ed),
2
)
) %>%
filter(!is.na(score_orientation))
score_moyen <- mean(data$score_orientation)
# Intervalle de confiance
n <- length(data$score_orientation)
score_var <- var(data$score_orientation)
alpha <- 0.05
quant_stud <- qt(1-alpha/2, df=n-1)
borne_inf <- score_moyen - quant_stud * sqrt(score_var/n)
borne_sup <- score_moyen + quant_stud * sqrt(score_var/n)
paste(borne_inf, "<", score_moyen, "<", borne_sup)
## [1] "0.58203329077629 < 0.582397657293831 < 0.582762023811372"
Cela indique que l’orientation politique française actuelle se situe plutôt au centre-droit.
Notre objectif initial est d’explorer la corrélation entre le niveau de richesse et l’orientation politique. Les politiques de droite étant souvent perçues comme plus favorables aux personnes disposant de revenus élevés, il est raisonnable d’anticiper une corrélation positive entre un haut niveau de richesse et un soutien aux partis de droite.
N’ayant pas de données sur le niveau de vie en 2012, nous ne séléctionnerons pas de datas sur cette année. Voici le dataset que nous utiliserons:
<<<<<<< HEAD| code_bureau_vote | votants | non_exp | voix_eg | pourcentage_voix_votant_eg | voix_g | pourcentage_voix_votant_g | voix_c | pourcentage_voix_votant_c | voix_d | pourcentage_voix_votant_d | voix_ed | pourcentage_voix_votant_ed | code_insee | population_ratio | libelle | nb_25 | nb_25_64 | nb_65 | prop_25 | prop_25_64 | prop_65 | taux_nat | taux_mort | nb_non_scolarises | part_non_peu_diplomes | part_bepc_brevet | part_cap_bep | part_bac | nb_h_total | nb_f_total | nb_h_15_24 | nb_h_25_64 | nb_h_65 | nb_f_15_24 | nb_f_25_64 | nb_f_65 | population_totale | proportion_h | proportion_f | nb_emplois_lt | taux_activite | part_emplois_salaries | part_agriculteurs | part_emplois_non_salaries | part_artisans | part_commercants | part_chefs_entreprise | part_cadres | part_prof_intermediaires | part_employes | part_ouvriers | annees | nb_menages | nb_menages_pauvres | nb_menages_seul | nb_menages_5plus | nb_menages_proprietaires | nb_menages_monoparentaux | niveau_vie_total | surface_totale_logements | nb_logements_collectifs | nb_logements_maisons | nb_log_avant_1945 | nb_log_1945_1969 | nb_log_1970_1989 | nb_log_apres_1990 | nb_log_date_inconnue | nb_logements_sociaux | part_bac2 | part_bac3_4 | part_bac5_plus | score_orientation |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 430890003 | 658 | 17 | 12 | 1.823708 | 163 | 24.772036 | 200 | 30.39514 | 170 | 25.835866 | 96 | 14.58967 | 43089 | 0.33417979 | Espaly-Saint-Marcel | 332.5089 | 583.8121 | 263.3337 | 28.2 | 49.5 | 22.3 | 10.4 | 11.4 | =======|||||||||||||||||||||||||||||||||||||||||||||||||
| 314330003 | 565 | 12 | 13 | 2.300885 | 223 | 39.46903 | 134 | 23.71681 | 25 | 4.424779 | 158 | 27.964602 | 31433 | 0.106423055 | Portet-sur-Garonne | 314.5866 | 510.2985 | 218.5930 | 30.1 | 48.9 | 20.9 | 10.8 | 7.9 | 728.3594 | 20.7 | 5.6 | 23.5 | 17.8 | 299.0488 | 318.3114 | 55.55283 | 181.5577 | 61.93822 | 51.50876 | 199.8625 | 66.94010 | 617.3601 | 0.484 | 0.516 | 796.0445 | 77.4 | 89.9 | 0.2 | 10.1 | 6.6 | 27.9 | 14.6 | 28.9 | 21.8 | 90.5 | 67.8 | 2018-2022 | 384.402 | 47.018 | 68.575 | 49.420 | 215.801 | 58.550 | 26255193 | 36296.05 | 32.462 | 351.940 | 8.734 | 4.512 | 9.040 | 362.052 | 0.064 | 107.322 | 10.9 | 10.0 | 11.5 | 0.54 |
| 750561716 | 1246 | 16 | 20 | 1.605136 | 441 | 35.39326 | 387 | 31.05939 | 293 | 23.515249 | 89 | 7.142857 | 75056 | 0.001141614 | Paris | 690.8456 | 1421.3873 | 406.7263 | 27.4 | 56.4 | 16.1 | 13.4 | 6.2 | >>>>>>> d368102 (feat: added model description and study)NA | NA | NA | NA | NA | <<<<<<< HEAD348.2153 | 365.9269 | 80.20315 | 199.8395 | 68.17268 | 85.55003 | 218.2194 | 62.15744 | 714.1422 | 0.488 | 0.512 | 277.7034 | 73.1 | 87.7 | 0.5 | 12.3 | 6.8 | 8.2 | 27.2 | 21.7 | 35.6 | 90.5 | 51.4 | 2013-2017 | 456.194 | 45.021 | 136.668 | 36.465 | 302.518 | 51.048 | 24163632 | 45341.12 | 117.253 | 338.941 | 77.185 | 61.906 | 170.295 | 141.972 | 4.836 | 64.727 | NA | NA | NA | 0.57 |
| 952800017 | 573 | 27 | 9 | 1.570681 | 310 | 54.101222 | 112 | 19.54625 | 12 | 2.094241 | 103 | 17.97557 | 95280 | 0.05348143 | Goussainville | 633.1666 | 817.7310 | 190.6078 | 38.6 | 49.8 | 11.6 | 18.8 | 5.6 | 1070.698 | 34.2 | 6.1 | 22.8 | 18.1 | 518.1815 | 545.7245 | 123.70254 | 302.1166 | 92.41590 | 122.52595 | 330.8896 | 92.30894 | 1063.9060 | 0.487 | 0.513 | 447.8535 | 67.5 | 91.1 | 0.1 | 8.9 | 6.2 | 25.9 | 10.7 | 26.8 | 30.3 | 81.9 | 60.1 | 2018-2022 | 408.722 | 62.421 | 55.010 | 103.801 | 215.906 | 66.923 | 28412402 | 32986.54 | 126.469 | 282.253 | 0.000 | 0.000 | 1.077 | 407.645 | 0.000 | 174.852 | 8 | 5.9 | 5 | 0.45 |
| 311210001 | 43 | 2 | 1 | 2.325581 | 4 | 9.302326 | 15 | 34.88372 | 4 | 9.302326 | 17 | 39.53488 | 31121 | 1.00000000 | Castéra-Vignoles | 16.0000 | 27.0000 | 22.0000 | 24.6 | 41.5 | 33.8 | 3.2 | 22.1 | NA | NA | NA | NA | NA | 15.0000 | 16.0000 | 4.00000 | 11.0000 | 0.00000 | 2.00000 | 10.0000 | 4.00000 | 31.0000 | 0.484 | 0.516 | 5.0000 | 80.6 | 0.0 | 0.0 | 100.0 | 100.0 | 0.0 | 0.0 | 0.0 | 0.0 | 95.2 | 83.3 | 2013-2017 | 27.170 | 3.762 | 8.509 | 1.353 | 22.638 | 3.183 | 1339856 | 3692.57 | 1.277 | 25.893 | 17.570 | 0.238 | 1.538 | 7.736 | 0.088 | 0.000 | NA | NA | NA | 0.70 | 838.3250 | 917.4377 | 128.43160 | 555.5848 | 154.30857 | 151.42599 | 585.9461 | 180.06681 | 1755.7627 | 0.477 | 0.523 | 2052.3313 | 77.7 | 86.5 | 0.0 | 13.5 | 5.3 | 35.0 | 25.3 | 25.0 | 9.3 | 91.7 | 70.0 | 2013-2017 | 889.060 | 127.971 | 341.558 | 84.679 | 194.920 | 145.568 | 58448853 | 59693.64 | 877.246 | 11.814 | 356.862 | 196.318 | 235.869 | 99.855 | 0.157 | 482.327 | NA | NA | NA | 0.50 |
| 596480001 | 631 | 9 | 7 | 1.109350 | 223 | 35.34073 | 209 | 33.12203 | 31 | 4.912837 | 152 | 24.088748 | 59648 | 0.091330149 | Wattignies | 483.1365 | 674.9298 | 260.3823 | 34.1 | 47.6 | 18.4 | 15.2 | 6.9 | 857.4988 | 20.9 | 6.2 | 18.9 | 17.5 | 403.7706 | 462.8612 | 86.67231 | 246.5914 | 70.50688 | 105.02967 | 271.5245 | 86.30699 | 866.6318 | 0.466 | 0.534 | 235.3578 | 74.7 | 87.5 | 0.2 | 12.5 | 4.2 | 25.7 | 14.1 | 41.8 | 14.0 | 89.4 | 64.2 | 2018-2022 | 638.917 | 105.399 | 254.336 | 43.038 | 277.987 | 84.291 | 31026893 | 51676.52 | 389.456 | 249.462 | 22.682 | 185.540 | 324.150 | 106.546 | 0.000 | 209.216 | 12.2 | 10.5 | 14.0 | 0.54 |
Observons rapidement la répartition des richesses en fonction des <<<<<<< HEAD votes:
On constate qu’effectivement le niveau de vie semble impacter le pourcentage de voix d’extrême gauche mais n’explique pas tout. Pour ce qui est de l’extrème droite, on observe une grande répartition donc le niveau de vie ne semble pas un facteur premier. Mais il y a tout de même cette tendance, ce qui laisse penser que la pauvreté pousse à voté dans les extrêmes.
Comparons maintenant avec notre score :
<<<<<<< HEADNous cherchons une diagonale allant de l’angle inférieur gauche vers l’angle supérieur droit. Ce n’est pas le cas ici, ce qui indique que l’influence de la richesse sur les votes n’est pas significative lorsqu’elle est observée isolément. En revanche, notre théorie semble se confirmer : plus le niveau de richesse est faible, plus les votes tendent vers les extrêmes.
En conclusion, la richesse permet simplement d’expliquer qu’un niveau de vie bas est associé à une probabilité plus élevée de vote pour les extrêmes.
Beaucoup de variable étant des quantités, il est intéressant de plutôt utiliser des proportions. Il faut également supprimer les colonnes inutiles car déjà représenté par d’autres (ex: Taux homme et Nb d’homme).
Comme nous l’avons vu précédemment, il est intéressant de ploter notre score face à nos différentes données, nous allons donc tous les tester rapidement et essayer d’observer.
Cette matrice de graphiques en dispersions nous donne un bonne aperçu de quel variables seront intéressantes à étudier.
=======Comme évoqué précédemment, il est pertinent de visualiser notre score en fonction de nos différentes variables explicatives. Nous allons donc les tester rapidement et observer les tendances qui en ressortent.
Cette matrice de graphiques de dispersion offre un bon aperçu des facteurs qui méritent d’être approfondies.
>>>>>>> d368102 (feat: added model description and study)Après avoir fusionné toutes les données issues des élections présidentielles de 2012, 2017 et 2022, nous avons construit des cartes géographiques illustrant l’évolution de l’intention de vote des Français au fil du temps. Ces cartes mettent en évidence les changements significatifs dans les orientations politiques de l’électorat, avec une représentation des zones dominées par les votes à droite (teintes bleues) et à gauche (teintes rouges).
En analysant les cartes de 2012, 2017 et 2022, nous pouvons observer un basculement marqué vers la droite dans de nombreuses régions, particulièrement dans le Nord-Est de la France. Toutefois, certaines régions, comme la Bretagne, conservent une stabilité de vote à gauche.
Cette transition dans les résultats électoraux nous invite à explorer plus en détail les facteurs sous-jacents à ces changements, notamment en cherchant des corrélations entre différentes variables socio-économiques et les tendances politiques observées.
# Préparation des données
df_model <- clean_data %>%
group_by(code_bureau_vote) %>%
slice_sample(n = 1) %>%
ungroup() %>%
select(where(is.numeric)) %>%
select(-contains("voix")) %>%
filter(!is.na(score_orientation)) %>%
slice_sample(n = 100)
write.csv(df_model, file = "big_score_training_data.csv", row.names = FALSE)
nzv <- nearZeroVar(df_model, saveMetrics = TRUE)
df_model <- df_model[, !nzv$nzv]
preProcValues <- preProcess(df_model, method = "medianImpute")
df_model <- predict(preProcValues, df_model)
num_cores <- parallel::detectCores() - 1
cl <- makeCluster(num_cores)
registerDoParallel(cl)
train_ctrl <- trainControl(
method = "repeatedcv",
number = 5,
repeats = 3,
verboseIter = TRUE,
allowParallel = FALSE
)
tune_grid <- expand.grid(
mtry = c(2, 4, 6, 8),
splitrule = c("variance", "extratrees"),
min.node.size = c(5, 10, 15)
)
df_model <- as.data.frame(df_model)
X <- df_model[, setdiff(names(df_model), "score_orientation")]
Y <- df_model$score_orientation
set.seed(123)
rf_model <- train(
x = X,
y = Y,
method = "ranger",
trControl = train_ctrl,
tuneGrid = tune_grid,
num.trees = 500,
importance = "impurity"
)
stopCluster(cl)
saveRDS(rf_model, file = "big_score_model.rds")
On commence par extraire les variables significatives de la random forest :
# Charger le modèle depuis le fichier RDS
rf_model <- readRDS("big_score_model.rds")
# Extraire l'importance des variables
importance_vars <- varImp(rf_model, scale = FALSE)
importance_df <- as.data.frame(importance_vars$importance)
importance_df$variable <- rownames(importance_df)
# Trier par importance décroissante
importance_df <- importance_df[order(-importance_df$Overall), ]
# Choisir un seuil d'importance (exemple : garder les variables dont l'importance est supérieure à 5% du max)
seuil <- 0.05 * max(importance_df$Overall)
selected_vars <- importance_df[importance_df$Overall >= seuil, ]
selected_vars
Puis on peut essayer d’analyser des profils types et les variables qui influent :
# Charger le dataset depuis le fichier CSV
model_data <- read.csv("big_score_training_data.csv")
# Sélection des colonnes utilisées dans le modèle
model_vars <- setdiff(colnames(model_data), "score_orientation")
# Fonction pour extraire plusieurs observations par tranche de `score_orientation`
extract_observations_group <- function(data, lower_bound, upper_bound, model_vars, n = 20) {
data %>%
filter(score_orientation >= lower_bound, score_orientation < upper_bound) %>%
select(all_of(c(model_vars, "score_orientation"))) %>%
slice_sample(n = n) # Prendre des observations aléatoires
}
# Création des 5 groupes d'observations
X_group1 <- extract_observations_group(model_data, 0.0, 0.2, model_vars, n = 20)
X_group2 <- extract_observations_group(model_data, 0.2, 0.4, model_vars, n = 20)
X_group3 <- extract_observations_group(model_data, 0.4, 0.6, model_vars, n = 20)
X_group4 <- extract_observations_group(model_data, 0.6, 0.8, model_vars, n = 20)
X_group5 <- extract_observations_group(model_data, 0.8, 1.0, model_vars, n = 20)
# Fonction pour calculer la moyenne des valeurs SHAP pour un groupe d'observations
compute_shapley_mean <- function(predictor, x_interest_group) {
shapley_results <- lapply(1:nrow(x_interest_group), function(i) {
x_interest <- x_interest_group[i, , drop = FALSE]
shapley <- Shapley$new(predictor, x.interest = x_interest)
shapley$results %>% mutate(observation_id = i)
})
shapley_combined <- do.call(rbind, shapley_results)
shapley_mean <- shapley_combined %>%
group_by(feature) %>%
summarise(mean_phi = mean(abs(phi)), .groups = 'drop')
return(shapley_mean)
}
# Calcul des valeurs SHAP moyennes pour chaque groupe
shapley_mean1 <- compute_shapley_mean(predictor, X_group1)
shapley_mean2 <- compute_shapley_mean(predictor, X_group2)
shapley_mean3 <- compute_shapley_mean(predictor, X_group3)
shapley_mean4 <- compute_shapley_mean(predictor, X_group4)
shapley_mean5 <- compute_shapley_mean(predictor, X_group5)
# Visualisation des profils types par tranche
plot_shapley_profile <- function(shapley_mean, title) {
ggplot(shapley_mean, aes(x = reorder(feature, -mean_phi), y = mean_phi)) +
geom_bar(stat = "identity", fill = "steelblue") +
coord_flip() +
labs(title = title, x = "Feature", y = "Valeur SHAP moyenne (abs)") +
theme_minimal()
}
# Plots des profils types pour chaque tranche
plot_shapley_profile(shapley_mean1, "Profil type pour la tranche [0.0 - 0.2[")
plot_shapley_profile(shapley_mean2, "Profil type pour la tranche [0.2 - 0.4[")
plot_shapley_profile(shapley_mean3, "Profil type pour la tranche [0.4 - 0.6[")
plot_shapley_profile(shapley_mean4, "Profil type pour la tranche [0.6 - 0.8[")
plot_shapley_profile(shapley_mean5, "Profil type pour la tranche [0.8 - 1.0]")
# Fonction pour calculer la moyenne des valeurs SHAP par groupe de variables
compute_shapley_influence <- function(shapley_means) {
shapley_means %>%
mutate(Group = case_when(
grepl("prop|population", feature) ~ "Démographie",
grepl("emplois|ouvriers|employes", feature) ~ "Emploi",
grepl("menages|logements", feature) ~ "Habitation",
TRUE ~ "Autre"
)) %>%
group_by(Group) %>%
summarise(
mean_phi = mean(mean_phi),
sd_phi = sd(mean_phi),
.groups = 'drop'
) %>%
arrange(desc(mean_phi))
}
# Calculer les moyennes SHAP pour chaque groupe d'observations
shapley_mean1_grouped <- compute_shapley_influence(shapley_mean1)
shapley_mean2_grouped <- compute_shapley_influence(shapley_mean2)
shapley_mean3_grouped <- compute_shapley_influence(shapley_mean3)
shapley_mean4_grouped <- compute_shapley_influence(shapley_mean4)
shapley_mean5_grouped <- compute_shapley_influence(shapley_mean5)
# Visualisation de la dispersion des valeurs SHAP par groupe
plot_group_distribution <- function(shapley_means, title) {
ggplot(shapley_means, aes(x = Group, y = mean_phi, fill = Group)) +
geom_boxplot(outlier.color = "red", outlier.shape = 1) +
geom_jitter(width = 0.2, alpha = 0.5) +
labs(
title = title,
x = "Groupes de variables",
y = "Valeur SHAP (importance absolue)"
) +
theme_minimal() +
theme(plot.title = element_text(hjust = 0.5))
}
# Plots pour chaque tranche de score
plot_group_distribution(shapley_mean1_grouped, "Distribution des valeurs SHAP [0.0 - 0.2[")
plot_group_distribution(shapley_mean2_grouped, "Distribution des valeurs SHAP [0.2 - 0.4[")
plot_group_distribution(shapley_mean3_grouped, "Distribution des valeurs SHAP [0.4 - 0.6[")
plot_group_distribution(shapley_mean4_grouped, "Distribution des valeurs SHAP [0.6 - 0.8[")
plot_group_distribution(shapley_mean5_grouped, "Distribution des valeurs SHAP [0.8 - 1.0]")
Le choix du modèle s’est orienté vers une random forest pour sa capacité à modéliser des interactions complexes entre les variables explicatives. L’implémentation ranger a été retenue en raison de ses performances optimisées, tant en termes de rapidité d’entraînement que de gestion de grandes quantités de données. L’objectif est de détecter des corrélations non linéaires qui pourraient influencer le vote de manière subtile et difficilement perceptible avec des modèles plus simples. Cette approche permet d’obtenir un bon équilibre entre le temps de calcul, la robustesse des prédictions et l’interprétabilité des résultats. Le script détaillé, incluant les paramètres d’entraînement et les étapes de prétraitement, est disponible en annexe pour une analyse complète et reproductible.
Notre modèle affiche un R-squared de 0.6196, un RMSE de 0.0514 et un MAE de 0.0385, sur 71 013 observations et 43 variables explicatives. Cela signifie que les facteurs socio-démographiques expliquent environ 61 % de la variabilité du vote, ce qui traduit une bonne capacité à identifier des corrélations pertinentes entre les variables et le comportement électoral.
Cependant, cette performance doit être nuancée par la faible variance du score cible, ce qui limite l’amplitude des variations à expliquer. Les erreurs faibles (MAE et RMSE) indiquent une précision notable, mais environ 40 % de la variabilité reste inexpliquée, probablement en raison de facteurs non modélisés, comme des préférences individuelles ou des contextes locaux spécifiques.
Nous commençons par identifier les variables significatives de notre modèle en utilisant le score d’importance basé sur l’impureté. Ce score correspond à la somme des réductions d’impureté réalisées par l’ensemble des arbres lorsqu’une variable est utilisée pour diviser un nœud. Bien que cette notion d’impureté puisse nous être peu familière, elle reste un indicateur fiable pour évaluer l’importance des variables. Nous obtenons ainsi :
## Overall
## nb_logements_collectifs_prop_nb_menages 27.01208
## part_ouvriers 26.95906
## part_employes 25.93545
## nb_logements_maisons_prop_nb_menages 22.48439
## part_cap_bep 20.89493
## surface_totale_logements_prop_nb_menages 19.49009
## prop_25 15.98144
## votants 15.40846
## nb_emplois_lt_prop_votants 14.87260
## part_emplois_non_salaries 14.10320
## part_emplois_salaries 13.65021
## variable
## nb_logements_collectifs_prop_nb_menages nb_logements_collectifs_prop_nb_menages
## part_ouvriers part_ouvriers
## part_employes part_employes
## nb_logements_maisons_prop_nb_menages nb_logements_maisons_prop_nb_menages
## part_cap_bep part_cap_bep
## surface_totale_logements_prop_nb_menages surface_totale_logements_prop_nb_menages
## prop_25 prop_25
## votants votants
## nb_emplois_lt_prop_votants nb_emplois_lt_prop_votants
## part_emplois_non_salaries part_emplois_non_salaries
## part_emplois_salaries part_emplois_salaries
On peut en conclure que des facteurs tels que la proportion de logements collectifs, de maisons et leur taille influencent l’orientation des votes au sein d’un bureau de vote. On observe également l’influence de facteurs liés à l’emploi, comme la proportion d’ouvriers et d’employés. Ces éléments seront décrits plus en détail lors de la synthèse.
Enfin, nous pouvons analyser des profils types et identifier les variables qui influencent ces profils. Pour cela, nous effectuons des prédictions à partir de notre modèle tout en catégorisant les observations afin d’examiner, pour chaque catégorie, les principales variables influentes. Nous utilisons la méthode de Shapley et les valeurs SHAP pour déterminer ces contributions. Voici les diagrammes correspondants :
Nous voyons instantanément qu’il y a eu de gros changements dans l’intention de vote des Français entre 2012 et 2022. Sur ces cartes, l’intensité des couleurs représente la force des tendances politiques : plus la teinte est bleue, plus l’électorat vote à droite ; plus elle est rouge, plus l’électorat vote à gauche.
En 2012, très peu de communes montrent un vote majoritaire à droite. Le bleu est peu présent sur la carte, avec une concentration visible principalement dans certaines zones du Nord-Est de la France.
En 2017 et en 2022, le bleu est beaucoup plus représenté, notamment dans le Nord-Est où il domine largement et atteint souvent des teintes de bleu foncé. Cette évolution marque un basculement progressif d’une partie importante de l’électorat vers la droite, avec des contrastes régionaux de plus en plus marqués.
Cependant, certaines régions ont conservé une certaine stabilité dans leurs choix politiques. La Bretagne, par exemple, reste l’une des régions où le vote à gauche est resté dominant et où les évolutions dans les tendances politiques sont beaucoup moins marquées.
Élection présidentielle 2022